package com.turing.post.cardmanagement.util;

import java.math.BigInteger;
import java.util.HashMap;
import java.util.List;

import javax.ejb.Local;
import javax.ejb.Remote;

import com.turing.post.util.PCPSApplicationException;
import com.turing.post.util.PCPSWebInput;

/**
 * 卡片库存管理
 * 
 * @author YangShuo
 * 
 */
@Remote
@Local
public interface CardStockDao {

	/**
	 * 根据Batchno查询剩余库存
	 * 
	 * @param Batchno
	 * @return CardStock 对象集合
	 */
	public Integer getCardStockListByBatchno(String Batchno, String status);

	/**
	 * 根据卡序号获取卡库存
	 * 
	 * @param cardseqno
	 * @return
	 */
	public CardStock getCardStockByCardseqno(String cardseqno);

	/**
	 * 根据卡号或卡序号获取卡库存
	 * 
	 * @param cardNo
	 * @return
	 */
	public CardStock getCardStockByCardSeqNoOrCardNo(String cardNo);

	/**
	 * 更新卡库存信息
	 * 
	 * @param cs
	 */
	public void updateCardStock(CardStock cs) throws PCPSApplicationException;;

	/**
	 * 根据发卡商机构号查询库存
	 * 
	 * @param IssueBranchNo
	 *            机构号
	 * @return CardStock 集合
	 */
	public List<CardStock> getCardStockListBySysIssueBranchNo(
			String IssueBranchNo);

	/**
	 * 根据销售机构号查询库存 param SaleBranchNo 销售机构号
	 * 
	 * @return CardStock 集合
	 */
	public List<CardStock> getCardStockListBySysSaleBranchNo(String SaleBranchNo);

	/**
	 * 根据销售机构号及状态查询库存
	 * 
	 * @param SaleBranchNo
	 *            销售机构号
	 * @param status
	 *            状态
	 * @return CardStock 集合
	 */
	public List<CardStock> getCardStockListBySysSaleBranchNoAndStatus(
			String SaleBranchNo, String status);

	/**
	 * 根据发卡商机构号及状态查询库存
	 * 
	 * @param IssueBranchNo
	 *            发卡商机构号
	 * @param status
	 *            状态
	 * @return CardStock 集合
	 */
	public List<CardStock> getCardStockListBySysIssueBranchNoAndStatus(
			String IssueBranchNo, String status);

	/**
	 * 插入操作
	 * 
	 * @param CardStock
	 *            对象
	 * @throws PCPSApplicationException
	 */
	public void insertCardStock(CardStock CardStock)
			throws PCPSApplicationException;

	/**
	 * 删除
	 * 
	 * @param cardStock
	 *            对象
	 * @throws PCPSApplicationException
	 */
	public void removeCardStock(CardStock cardStock)
			throws PCPSApplicationException;

	/**
	 * 批量修改状态操作
	 * 
	 * @param batchno
	 *            批次号
	 * @param startCardSeqNo
	 *            开始序列号
	 * @param endCardSeqNo
	 *            结束序列号
	 * @param status
	 *            状态
	 * @return Integer结果
	 * @throws PCPSApplicationException
	 */
	public Integer updateCardStock(String batchno, String startCardSeqNo,
			String endCardSeqNo, String status) throws PCPSApplicationException;

	/**
	 * 批量修改状态操作
	 * 
	 * @param batchno
	 * @param startCardSeqNo
	 * @param endCardSeqNo
	 * @param status
	 * @param salesGetCardOrderId
	 * @return
	 * @throws PCPSApplicationException
	 */
	public void updateCardStockForSalesGetCardOrder(String batchno,
			String startCardSeqNo, String endCardSeqNo, String status,
			BigInteger salesGetCardOrderId) throws PCPSApplicationException;

	/**
	 * 修改所属机构和状态
	 * 
	 * @param batchno
	 *            批次号
	 * @param startCardSeqNo
	 *            开始序列号
	 * @param endCardSeqNo
	 *            结束序列号
	 * @param status
	 *            状态
	 * @return Integer结果
	 * @throws PCPSApplicationException
	 */
	public Integer updateCardStockwithBranch(String batchno,
			String startCardSeqNo, String endCardSeqNo, String status,
			String IssueBranchNo, String SaleBranchNo)
			throws PCPSApplicationException;

	/**
	 * 批量删除操作
	 * 
	 * @param batchno
	 *            批次号
	 * @param startCardSeqNo
	 *            起始序列号
	 * @param endCardSeqNo
	 *            结束序列号
	 */
	public Integer deleteCardStock(String batchno, String startCardSeqNo,
			String endCardSeqNo) throws PCPSApplicationException;

	/**
	 * 查询某销售机构序号段卡库存数量
	 * 
	 * @param startCardSeqNo
	 *            起始序列号
	 * @param endCardSeqNo
	 *            结束序列号
	 * @param status
	 *            状态
	 * @param SaleBranchNo
	 *            销售机构号
	 * @return 记录条数
	 */
	public Integer getCardStockListCountBySaleBranchNoAndStatusAndCredseqno(
			String startCardSeqNo, String endCardSeqNo, String status,
			String SaleBranchNo);

	/**
	 * 查询某销售机构序号段卡库存
	 * 
	 * @param startCardSeqNo
	 *            起始序列号
	 * @param endCardSeqNo
	 *            结束序列号
	 * @param status
	 *            状态
	 * @param SaleBranchNo
	 *            销售机构号
	 * @return CardStock 对象集合
	 */
	public List<CardStock> getCardStockListBySaleBranchNoAndStatusAndCredseqno(
			String startCardSeqNo, String endCardSeqNo, String status,
			String SaleBranchNo);

	/**
	 * 销售单所销售卡库存列表，用于自动产生实名excel使用
	 * 
	 * @param startCardSeqNo
	 *            起始序列号
	 * @param endCardSeqNo
	 *            结束序列号
	 * @param SaleBranchNo
	 *            销售机构号
	 * @return CardStock 对象集合
	 */
	public List<CardStock> getCardStockListBySaleBranchNoAndCardSeqNo(
			String startCardSeqNo, String endCardSeqNo, String saleBranchNo);

	// /**
	// * 根据卡号、卡顺序号和制卡批次号验资卡是否存在激活卡库存里
	// * @param batchNo
	// * @param cardSeqNo
	// * @param cardNo
	// */
	// public CardStock checkCardExistInCardStock(String batchNo, String
	// cardSeqNo);

	/**
	 * 根据发卡商机构号,状态查询卡种类集合
	 * 
	 * @param IssueBranchNo
	 *            机构号
	 * @param status
	 *            状态
	 * @return CardStockClassicInfo集合
	 */
	public List<CardStockClassicInfo> getCardStockListBySysBranchNo_Cardclassic_Parvalue_Status(
			String IssueBranchNo, String status);

	/**
	 * 根据机构号及状态查询库存卡种类
	 * 
	 * @param branchno
	 *            机构号
	 * @param status
	 *            状态
	 * @return 卡种类ID集合
	 */
	public BigInteger[] getCardClassicBybranchno(String branchno, String status)
			throws PCPSApplicationException;

	/**
	 * 根据机构号,卡种类，及状态查询库存卡面值
	 * 
	 * @param branchno
	 *            机构号
	 * @param cardclassid
	 *            卡种类
	 * @param status
	 *            状态
	 * @return 卡面值ID集合
	 */
	public BigInteger[] getCardParvalueBybranchno(String branchno,
			BigInteger cardclassid, String status);

	/**
	 * 根据机构号,卡种类，卡面值及状态查询库存
	 * 
	 * @param branchno
	 *            机构号
	 * @param cardclassid
	 *            卡种类ID
	 * @param cardclassid
	 *            cardparvalueid 卡面值ID
	 * @param status
	 *            状态
	 * @return 库存数量
	 */
	public Integer getCardStockBybranchno_parvalue_status(String branchno,
			BigInteger cardclassid, BigInteger cardparvalueid, String status)
			throws PCPSApplicationException;

	/**
	 * 根据机构号,起止序号，状态查询卡库存
	 * 
	 * @param branchno
	 * @param cardclassid
	 * @param status
	 * @return CardStock对象集合
	 */
	public List<CardStock> getCardStockListCountBySysbranchnoNoAndStatusAndCredseqno(
			String startCardSeqNo, String endCardSeqNo, String status,
			String SysBranchNo);

	/**
	 * 锁定销售机构、指定批次、指定卡序号范围、指定状态
	 * 
	 * @param batchNo
	 * @param saleBranchNo
	 * @param startCardSeqNo
	 * @param endCardSeqNo
	 * @return CardStock 对象集合
	 */
	public List<CardStock> getCardStockListByFilterForUpdate(String batchNo,
			String saleBranchNo, String startCardSeqNo, String endCardSeqNo);

	/**
	 * 卡库存查询记录数
	 * 
	 * @param webInput
	 * @param branchno
	 * @param batchno
	 * @param status
	 * @param cardFaceId
	 * @return
	 */
	public Integer getBranchCardStockCount(PCPSWebInput webInput,
			String branchno, String batchno, String status,
			BigInteger cardFaceId);

	/**
	 * 卡库存查询记录列表
	 * 
	 * @param webInput
	 * @param branchno
	 * @param batchno
	 * @param status
	 * @param cardFaceId
	 * @param page
	 * @return
	 */
	public List<BranchCardStock> getBranchCardStock(PCPSWebInput webInput,
			String branchno, String batchno, String status,
			BigInteger cardFaceId, Integer page);

	/**
	 * 卡库存详细信息查询，输入批次号，机构号，返回具体卡号段信息 参数说明 1.批次号 2.机构号 3.卡状态 -1表示查全部
	 * 
	 * @param 批次号
	 * @param 机构号
	 * @return 卡序号段集合
	 */
	public List<CardStock> getCardStockDetail(String batchno, String branchno,
			String status, Integer page);

	/**
	 * 卡库存详细信息查询，输入批次号，机构号，返回具体卡号段信息 总数 参数说明 1.批次号 2.机构号 3.卡状态 -1表示查全部
	 * 
	 * @param 批次号
	 * @param 机构号
	 * @return 卡序号段集合
	 */
	public BigInteger getCardStockDetailTotal(String batchno, String branchno,
			String status);

	/**
	 * @根据机构号,起止序号，状态查询卡库存数量
	 * @param startCardSeqNo
	 * @param endCardSeqNo
	 * @param status
	 * @param SysBranchNo
	 * @return
	 */
	public HashMap<String, Integer> getCardStockCountBySysbranchnoNoAndStatusAndCredseqno(
			String startCardSeqNo, String endCardSeqNo, String status,
			String SysBranchNo);

	/**
	 * 按卡号/卡序号检索卡库存
	 * 
	 * @param cardNo
	 *            卡号或卡序号
	 * @return
	 */
	public CardStock getCardStockByCardNoForUpdate(String cardNo);

	/**
	 * 数据迁移用
	 * 
	 * @return
	 */
	public List<CardStock> getCardStockListByBatchNo(String issueBranchNo,
			String batchNo);

	/**
	 * 数据迁移用
	 * 
	 * @return
	 */
	public List<Object[]> getCardStockList();

	/**
	 * 营销员领卡单查询
	 * 
	 * @param salesGetCardOrderId
	 * @return
	 */
	public List<Object[]> getCardStockCountBySalesCardOrderId(
			BigInteger salesGetCardOrderId);

	/**
	 * 获取领卡单剩余的卡数量与状态
	 * 
	 * @param salesGetCardOrderId
	 * @return
	 */
	public List<Object[]> getCardStockCountBySalesGetCardOrderId(
			BigInteger salesGetCardOrderId, int orderItemSeqNo);

	public List<Object[]> getCardStockReportOne(PCPSWebInput webInput,
			String branchNo);

	public List<Object[]> getCardStockReportTwo(String branchNo);

	public List<Object[]> getCardStockReportThird(String batchno,
			String branchno);

	public void deleteCardStock(String cardseqno)
			throws PCPSApplicationException;
}
